﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;

namespace PuanYonetimi
{
    public class Hareket
    {
        public int ID { get; set; }
        public decimal FisTutari { get; set; }
        public string OdemeAciklama { get; set; }
        public decimal OdemeTutari { get; set; }
        public int OdemeTipi { get; set; }
        public string CariKodu { get; set; }
    }

    public class Senkronizasyon
    {
        List<PuanTanim> Tanimlar = new List<PuanTanim>();

        private string GetConnectionString()
        {
            string serverName = Program.Session[Settings.BackOfficeServerName].ToString();
            string databaseName = Program.Session[Settings.BackOfficeVtName].ToString();
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
            sqlBuilder.DataSource = serverName;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.MultipleActiveResultSets = true;
            if (Program.Session[Settings.AuthenticateMode].ToString() == "Sql")
            {
                sqlBuilder.UserID = "sa";
                sqlBuilder.Password = Program.Session[Settings.Password].ToString();
                sqlBuilder.IntegratedSecurity = false;
            }
            else
                sqlBuilder.IntegratedSecurity = true;

            return sqlBuilder.ToString();
        }

        private string GetConnectionString2()
        {
            string serverName = Program.Session[Settings.BackOfficeServerName2].ToString();
            string databaseName = Program.Session[Settings.BackOfficeVtName2].ToString();
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
            sqlBuilder.DataSource = serverName;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.MultipleActiveResultSets = true;
            if (Program.Session[Settings.AuthenticateMode].ToString() == "Sql")
            {
                sqlBuilder.UserID = "sa";
                sqlBuilder.Password = Program.Session[Settings.Password].ToString();
                sqlBuilder.IntegratedSecurity = false;
            }
            else
                sqlBuilder.IntegratedSecurity = true;

            return sqlBuilder.ToString();
        }

        public void CariAktar()
        {
            try
            {
                string caridosya = Program.Session[Settings.CariSqlDosya].ToString();
                if (File.Exists(caridosya))
                {
                    using (PromoEntities ent = new PromoEntities())
                    {
                        List<Cari> yenicariler = ArkaOfisCariListele(File.ReadAllText(caridosya), ent.Cariler.Select(x => x.ID).ToArray());
                        foreach (Cari cr in yenicariler)
                        {
                            ent.AddToCariler(cr);
                        }
                        ent.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message + "\r\n" + GetConnectionString());
            }
        }

        private PuanTanim AktifTanim(string cariKodu, int odemeTipi)
        {
            //11*-12*-25*=38*
            //CARI.DAT’ DA KAYITLI OLAN VE CARIKODU 11 VE 12 İLE 
            //BAŞLAYAN VEYA CARIKODLARININ BAŞLANGICI 25 DEN BÜYÜK 
            //EŞİT VE 38DEN  KÜÇÜK EŞİT OLANLAR

            PuanTanim tanim = null;
            foreach (var item in Tanimlar.Where(x => x.OdemeTipi == 3 || x.OdemeTipi == odemeTipi))
            {
                if (item.MusteriAraligi == "")
                {
                    tanim = item;
                    break;
                }
                else
                {
                    if (item.MusteriAraligi == cariKodu) //tek cari için tanımlanmışsa
                    {
                        tanim = item;
                        break;
                    }
                    else //filtre uygulanmışsa
                    {
                        string[] filtreler = item.MusteriAraligi.Split('-');
                        if (filtreler.Length > 0)
                        {
                            foreach (string filtre in filtreler)
                            {
                                if (filtre.IndexOf('=') > -1)
                                {
                                    string[] tmp1 = filtre.Replace("=", "").Split('*');
                                    int c1 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[0].Length));
                                    int c2 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[1].Length));
                                    if (c1 >= Cevir.Parse<int>(tmp1[0]) && c2 <= Cevir.Parse<int>(tmp1[1]))
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                                else if (filtre.IndexOf('*') > -1)
                                {
                                    string tmp2 = filtre.Replace("*", "");
                                    if (cariKodu.Mid(0, tmp2.Length) == tmp2)
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return tanim;
        }

        bool tanimlarYuklendi = false;
        public void HareketPuanVer()
        {
            try
            {
                string hrdosya = Program.Session[Settings.HareketSqlDosya].ToString();
                if (File.Exists(hrdosya))
                {
                    using (PromoEntities ent = new PromoEntities())
                    {
                        if (!tanimlarYuklendi)
                        {
                            tanimlarYuklendi = true;
                            Tanimlar.AddRange(ent.PuanTanimlari.Where(x => x.BaslangicTarihi <= DateTime.Now && x.BitisTarihi >= DateTime.Now && x.No > 99).ToArray());
                        }

                        List<Hareket> hr = ArkaOfisHareketListele(File.ReadAllText(hrdosya));
                        foreach (Hareket item in hr)
                        {
                            PuanTanim tanim = AktifTanim(item.CariKodu, item.OdemeTipi);
                            if (tanim != null)
                                PuanVer(item.CariKodu, tanim, item.OdemeTutari, ent);

                            ent.AddToAktarilanHareketler(new AktarilanHareket() { HareketID = item.ID });
                            ent.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message + "\r\n" + GetConnectionString2());
            }
        }

        private void PuanVer(string cariKod, PuanTanim tanim, decimal OdemeTutari, PromoEntities ent)
        {
            BonusPuan bns = ent.BonusPuanlar.Where(x => x.Cari_Kod == cariKod).FirstOrDefault();
            if (bns != null)
            {
                bns.Puan += (OdemeTutari / (decimal)tanim.AlisverisToplami) * (decimal)tanim.VerilecekPuan;
                bns.KrediBakiyesi = 0;
                bns.KrediLimiti = 0;
                bns.RiskBakiyesi = 0;
                bns.RiskLimiti = 0;
                bns.ToplamTutar += OdemeTutari;
            }
            else
            {
                bns = new BonusPuan();
                bns.Puan = (OdemeTutari / (decimal)tanim.AlisverisToplami) * (decimal)tanim.VerilecekPuan;
                bns.Cari_Kod = cariKod;
                bns.KrediBakiyesi = 0;
                bns.KrediLimiti = 0;
                bns.RiskBakiyesi = 0;
                bns.RiskLimiti = 0;
                bns.ToplamTutar = OdemeTutari;
                ent.AddToBonusPuanlar(bns);
            }
        }

        private List<Cari> ArkaOfisCariListele(string sqlQuery, int[] mevcutCariler)
        {
            List<Cari> sonuc = new List<Cari>();
            using (SqlConnection cn = new SqlConnection(GetConnectionString()))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand(sqlQuery, cn))
                {
                    cmd.CommandTimeout = 999999;
                    SqlDataReader rd = cmd.ExecuteReader();
                    Cari cari;
                    while (rd.Read())
                    {
                        int id = Cevir.Parse<int>(rd[0]);
                        if (mevcutCariler.Where(x => x == id).Count() == 0)
                        {
                            cari = new Cari();
                            cari.ID = Cevir.Parse<int>(rd[0]);
                            cari.Kodu = Cevir.Parse<string>(rd[1]);
                            cari.Adi = Cevir.Parse<string>(rd[2]);
                            cari.Adresi = Cevir.Parse<string>(rd[3]);
                            cari.VergiDairesi = Cevir.Parse<string>(rd[4]);
                            cari.VergiNumarasi = Cevir.Parse<string>(rd[5]);
                            cari.IndirimOrani = Cevir.Parse<int>(rd[6]);
                            cari.FiyatNo = Cevir.Parse<int>(rd[7]);
                            sonuc.Add(cari);
                        }
                    }
                    rd.Close();
                }
                cn.Close();
            }
            return sonuc;
        }

        private List<Hareket> ArkaOfisHareketListele(string sqlQuery)
        {
            List<Hareket> sonuc = new List<Hareket>();
            using (SqlConnection cn = new SqlConnection(GetConnectionString2()))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand(sqlQuery, cn))
                {
                    cmd.CommandTimeout = 999999;
                    SqlDataReader rd = cmd.ExecuteReader();
                    Hareket hr;
                    while (rd.Read())
                    {
                        hr = new Hareket();
                        hr.ID = Cevir.Parse<int>(rd[0]);
                        hr.FisTutari = Cevir.Parse<decimal>(rd[1]);
                        hr.OdemeAciklama = Cevir.Parse<string>(rd[2]);
                        hr.OdemeTutari = Cevir.Parse<decimal>(rd[3]);
                        hr.OdemeTipi = Cevir.Parse<int>(rd[4]);
                        hr.CariKodu = Cevir.Parse<string>(rd[5]);
                        sonuc.Add(hr);
                    }
                    rd.Close();
                }
                cn.Close();
            }
            return sonuc;
        }
    }
}
